﻿#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//#include <ctype.h>
//int main() {
//	int i = 0;
//	char str[] = "Test String.\n";
//	char c;
//	while (str[i]) {
//		c = str[i];
//		if (islower(c)) {
//			c -= 32;
//			putchar(c);//输出一个字符
//			i++;
//		}
//	}
//	int ret = sizeof(str)/sizeof(str[0]);
//	for (i = 0; i < ret; i++) {
//		printf("%d", str[i]);
//	}
//	return 0;
//}

//#include <stdio.h>
//void Swap1(int x, int y) {
//	int tmp =  x;
//	x = y;
//	y = tmp;
//}
//void Swap2(int* p, int* s) {
//	int tmp = 0;
//	tmp = *p;
//	*p = *s;
//	*s = tmp;
//}
//int main() {
//	int a = 0;
//	int b = 0;
//	scanf("%d %d", &a, &b);
//	printf("交换前：a=%d b=%d\n", a, b);
//	//swap1(a, b);
//	Swap2(&a, &b);
//	printf("交换后：a=%d b=%d\n", a, b);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("&arr[0] = %p\n", &arr[0]);
//	printf("&arr[0]+1 = %p\n", &arr[0] + 1);
//	printf("arr = %p\n", arr);
//	printf("arr+1 = %p\n", arr + 1);
//	printf("&arr = %p\n", &arr);
//	printf("&arr+1 = %p\n", &arr + 1);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//	//输⼊
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//输⼊
//	int* p = arr;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", p + i);
//		//scanf("%d", arr+i);//也可以这样写
//	}
//	//输出
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", p[i]);//*(p+i)
//	}
//	return 0;
//}

//#include <stdio.h>
//void bubble_sort(int arr[], int sz) {
//	int i = 0;
//	for (i = 0; i < sz - 1; i++) {
//		int flag = 1;
//		int j = 0;
//		for (j = 0; j < sz-i-1; j++) {
//			if (arr[j] > arr[j + 1]) {
//				int tmp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = tmp;
//				flag = 0;//发生交换就说明无序
//			}
//		}
//		if (flag == 1) {//这一趟没交换说明以及有序了，后续无需排序了
//			break;
//		}
//	}
//}
//int main() {
//	int arr[] = { 3,1,5,7,6,4,2,9,8,0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sz);
//	for (int i = 0; i < sz; i++) {
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char str1[] = "hello bit.";
//	char str2[] = "hello bit.";
//	const char* str3 = "hello bit.";
//	const char* str4 = "hello bit.";
//	if (str1 == str2)
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n");
//	if (str3 == str4)
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//	return 0;
//}

//#include <stdio.h>
//int add(int a, int b)
//{
//	return a + b;
//}
//int sub(int a, int b)
//{
//	return a - b;
//}
//int mul(int a, int b)
//{
//	return a * b;
//}
//int div(int a, int b)
//{
//	return a / b;
//}
//int main()
//{
//	int x, y;
//	int input = 1;
//	int ret = 0;
//	do
//	{
//		printf("*************************\n");
//		printf(" 1:add 2:sub \n");
//		printf(" 3:mul 4:div \n");
//		printf(" 0:exit \n");
//		printf("*************************\n");
//		printf("请选择：");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			printf("输⼊操作数：");
//			scanf("%d %d", &x, &y);
//			ret = add(x, y);
//			printf("ret = %d\n", ret);
//			break;
//		case 2:
//			printf("输⼊操作数：");
//			scanf("%d %d", &x, &y);
//			ret = sub(x, y);
//			printf("ret = %d\n", ret);
//			break;
//		case 3:
//			printf("输⼊操作数：");
//			scanf("%d %d", &x, &y);
//			ret = mul(x, y);
//			printf("ret = %d\n", ret);
//			break;
//		case 4:
//			printf("输⼊操作数：");
//			scanf("%d %d", &x, &y);
//			ret = div(x, y);
//			printf("ret = %d\n", ret);
//			break;
//		case 0:
//			printf("退出程序\n");
//			break;
//		default:
//			printf("选择错误\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}

//#include <stdio.h>
//int add(int a, int b)
//{
//	return a + b;
//}
//int sub(int a, int b)
//{
//	return a - b;
//}
//int mul(int a, int b)
//{
//	return a * b;
//}
//int div(int a, int b)
//{
//	return a / b;
//}
//int main()
//{
//	int x, y;
//	int input = 1;
//	int ret = 0;
//	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
//	do
//	{
//		printf("*************************\n");
//		printf(" 1:add 2:sub \n");
//		printf(" 3:mul 4:div \n");
//		printf(" 0:exit \n");
//		printf("*************************\n");
//		printf("请选择：");
//		scanf("%d", &input);
//		if ((input <= 4 && input >= 1))
//		{
//			printf("输⼊操作数：");
//			scanf("%d %d", &x, &y);
//			ret = (*p[input])(x, y);
//			printf("ret = %d\n", ret);
//		}
//		else if (input == 0)
//		{
//			printf("退出计算器\n");
//		}
//		else
//		{
//			printf("输⼊有误\n");
//		}
//	} while (input);
//	return 0;
//}

////使⽤回调函数改造后
//#include <stdio.h>
//int add(int a, int b)
//{
//	return a + b;
//}
//int sub(int a, int b)
//{
//	return a - b;
//}
//int mul(int a, int b)
//{
//	return a * b;
//}
//int div(int a, int b)
//{
//	return a / b;
//}
//void calc(int (*pf)(int, int)) {
//	int ret = 0;
//	int x, y;
//	printf("请输入操作数：");
//	scanf("%d %d", &x, &y);
//	ret = pf(x, y);
//	printf("ret=%d\n", ret);
//}
//int main()
//{
//	int input = 1;
//	do
//	{
//		printf("*************************\n");
//		printf(" 1:add 2:sub \n");
//		printf(" 3:mul 4:div \n");
//		printf(" 0:exit \n");
//		printf("*************************\n");
//		printf("请选择：");
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			calc(add);
//			break;
//		case 2:
//			calc(sub);
//			break;
//		case 3:
//			calc(mul);
//			break;
//		case 4:
//			calc(div);
//			break;
//		case 0:
//			printf("退出程序\n");
//			break;
//		default:
//			printf("选择错误\n");
//			break;
//		}
//	} while (input);
//	return 0;
//}

//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//struct  stu
//{
//	char name[20];
//	int age;
//};
//int cmp_stu_by_age(const void* e1, const void* e2) {
//	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
//}
//int cmp_stu_by_name(const void* e1, const void* e2) {
//	return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);
//}
//void test2() {
//	struct stu s[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
//	for (int i = 0; i < sz; i++) {
//		printf("%d\n", s[i].age);
//	}
//}
//void test3() {
//	struct stu s[] = { {"zhangsan",20},{"lisi",30},{"wangwu",15} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
//	for (int i = 0; i < sz; i++) {
//		printf("%s\n", s[i].name);
//	}
//}
//int main() {
//	test2();
//	test3();
//	return 0;
//}

//#include <stdio.h> 
//int int_cmp(const void* p1, const void* p2)
//{
//	return (*(int*)p1 - *(int*)p2);
//}
//void _swap(void* p1, void* p2, int size)
//{
//	int i = 0;
//	for (i = 0; i < size; i++)
//	{
//		char tmp = *((char*)p1 + i);
//		*((char*)p1 + i) = *((char*)p2 + i);
//		*((char*)p2 + i) = tmp;
//	}
//}
//void bubble(void* base, int count, int size, int(*cmp)(void*, void*))
//{
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < count - 1; i++)
//	{
//		for (j = 0; j < count - i - 1; j++)
//		{
//			if (cmp((char*)base + j * size, (char*)base + (j + 1) * size) > 0)
//			{
//				_swap((char*)base + j * size, (char*)base + (j + 1) * size, size);
//			}
//		}
//	}
//}
//int main()
//{
//	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
//	int i = 0;
//	bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
//	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	printf("\n");
//	return 0;
//}

//#include <stdio.h>
//int check_sys() {
//	union {
//		int i;
//		char c;
//	}un;
//	un.i = 1;
//	return un.c;
//}
//int main() {
//	int ret = check_sys();
//	if (ret == 1) {
//		printf("小端");
//	}
//	else {
//		printf("大端");
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//int my_strncmp(const char* str1, const char* str2,size_t n) {
//	size_t i = 0;
//	int ret = 0;
//	assert(str1 != NULL);
//	assert(str2 != NULL);
//	while ((*str1 == *str2) && (i<n)) {
//		if (*str1 == '\0') {
//			return 0;
//		}
//		str1++;
//		str2++;
//		i++;
//	}
//	return *str1 - *str2;
//}
//
//int main() {
//	char arr1[20] = "abcd";
//	char arr2[] = "abcde";
//	size_t n = 0;
//	scanf("%zd", &n);
//	int ret = my_strncmp(arr1, arr2,n);
//	printf("%d\n", ret);
//	return 0;
//}

//#include <stdio.h>
//
//#include <string.h>
//
//#include <assert.h>
//
//char* my_strncat(char* dest, const char* src,size_t n) {
//
//	char* ret = dest;
//
//	assert(dest != NULL);
//
//	assert(src != NULL);
//
//	size_t i = 0;
//
//	while (*dest) {
//		dest++;
//	}
//
//	for (i = 0; i < n && src[i] != '\0'; i++) {
//		dest[i] = src[i];
//	}
//	if (i < n) {
//		dest[i] = '\0';
//	}
//
//	return ret;
//
//}
//
//int main() {
//
//	char arr1[20] = "abcdef";
//
//	char arr2[] = "hello";
//
//	size_t n = 0;
//
//	scanf("%d", &n);
//
//	my_strncat(arr1, arr2,n);
//
//	printf("%s\n", arr1);
//
//	return 0;
//
//}

//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//void* my_memcpy(void* dst, const void* src, size_t count)
//{
//	void* ret = dst;
//	assert(dst);
//	assert(src);
//	/*
//	* copy from lower addresses to higher addresses
//	*/
//	while (count--) {
//		*(char*)dst = *(char*)src;
//		dst = (char*)dst + 1;
//		src = (char*)src + 1;
//	}
//	return(ret);
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//	my_memcpy(arr2, arr1, 20);
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//void* my_memmove(void* dst, const void* src, size_t count)
//{
//	void* ret = dst;
//	if (dst <= src || (char*)dst >= ((char*)src + count)) {
//		/*
//		* Non-Overlapping Buffers
//		* copy from lower addresses to higher addresses
//		*/
//		while (count--) {
//			*(char*)dst = *(char*)src;
//			dst = (char*)dst + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else {
//		/*
//		* Overlapping Buffers
//		* copy from higher addresses to lower addresses
//		*/
//		dst = (char*)dst + count - 1;
//		src = (char*)src + count - 1;
//		while (count--) {
//			*(char*)dst = *(char*)src;
//			dst = (char*)dst - 1;
//			src = (char*)src - 1;
//		}
//	}
//	return(ret);
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memmove(arr1 + 2, arr1, 20);
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//#include <assert.h>
//char* my_strncpy(char* dest, const char* src, size_t num) {
//	char* ret = dest;
//	size_t i = 0;
//	assert(dest != NULL);
//	assert(src != NULL);
//	while (*src && i < num) {
//		*ret++ = *src++;
//		i++;
//	}
//	for (int j = i; j < num; j++) {
//		*ret++ = 0;
//	}
//	return dest;
//}
//int main() {
//	char arr1[20] = "abcdefg";
//	char arr2[] = "hello";
//	size_t num = 3;
//	strncpy(arr1, arr2, num);
//	printf("%s\n", arr1);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char str1[20];
//	char str2[20];
//	strcpy(str1, "To be ");
//	strcpy(str2, "or not to be");
//	strncat(str1, str2, 6);
//	printf("%s\n", str1);
//	return 0;
//}

///* strstr example */
//#include <stdio.h>
//#include <string.h>
//char* my_strstr(const char* str1, const char* str2)
//{
//	char* cp = (char*)str1;
//	char* s1, * s2;
//	if (!*str2)
//		return((char*)str1);
//	while (*cp)
//	{
//		s1 = cp;
//		s2 = (char*)str2;
//		while (*s1 && *s2 && !(*s1 - *s2))
//			s1++, s2++;
//		if (!*s2)
//			return(cp);
//		cp++;
//	}
//	return(NULL);
//}
//int main()
//{
//	char str[] = "This is a simple string";
//	char* pch;
//	pch = my_strstr(str, "simple");
//	strncpy(pch, "sample", 6);
//	printf("%s\n", str);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char arr[] = "192.168.6.111";
//	char* sep = ".";
//	char* str = NULL;
//	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
//	{
//		printf("%s\n", str);
//	}
//	return 0;
//}

//#include <errno.h>
//#include <string.h>
//#include <stdio.h>
//int main()
//{
//	int i = 0;
//	for (i = 0; i <= 10; i++) {
//		printf("%s\n", strerror(i));
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[10] = { 0 };
//	memcpy(arr2, arr1, 20);
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char str[] = "hello world";
//	memset(str, 'x', 6);
//	printf(str);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char buffer1[] = "DWgaOtP12df0";
//	char buffer2[] = "DWGAOTP12DF0";
//	int n;
//	n = memcmp(buffer1, buffer2, sizeof(buffer1));
//	if (n > 0)
//		printf("'%s' is more than '%s'.\n", buffer1, buffer2);
//	else if (n < 0)
//		printf("'%s' is less than '%s'.\n", buffer1, buffer2);
//	else
//		printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a = 10;
//	printf("%d\n", sizeof(a));
//	printf("%d\n", sizeof a);
//	printf("%d\n", sizeof(int));
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char arr1[3] = { 'a', 'b', 'c' };
//	char arr2[] = "abc";
//	printf("%d\n", strlen(arr1));
//	printf("%d\n", strlen(arr2));
//	printf("%d\n", sizeof(arr1));
//	printf("%d\n", sizeof(arr1));
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char* c[] = { "ENTER","NEW","POINT","FIRST" };
//	char** cp[] = { c + 3,c + 2,c + 1,c };
//	char*** cpp = cp;
//	printf("%s\n", **++cpp);//POINT
//	printf("%s\n", *-- * ++cpp + 3);//ER
//	printf("%s\n", *cpp[-2] + 3);//ST
//	printf("%s\n", cpp[-1][-1] + 1);//EW
//	return 0;
//}

//// 代码1
//#include <stdio.h>
//int check_sys()
//{
//	int i = 1;
//	return (*(char*)&i);
//}
//int main()
//{
//	int ret = check_sys();
//	if (ret == 1)
//	{
//		printf("⼩端\n");
//	}
//	else
//	{
//		printf("⼤端\n");
//	}
//	return 0;
//}
////代码2
//int check_sys()
//{
//	union
//	{
//		int i;
//		char c;
//	}un;
//	un.i = 1;
//	return un.c;
//}

//#include <stdio.h>
//int main()
//{
//	char a = -1;
//	signed char b = -1;
//	unsigned char c = -1;
//	printf("a=%d,b=%d,c=%d", a, b, c);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a = -128;
//	printf("%u\n", a);
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	char a = 128;
//	printf("%u\n", a);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	char a[1000];
//	int i;
//	for (i = 0; i < 1000; i++) {
//		a[i] = -1 - i;
//	}
//	printf("%d", strlen(a));
//	return 0;
//}

//#include <stdio.h>
//unsigned char i = 0;
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	unsigned int i;
//	for (i = 9; i >= 0; i--)
//	{
//		printf("%u\n", i);
//	}
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int a[4] = { 1, 2, 3, 4 };
//	int* ptr1 = (int*)(&a + 1);
//	int* ptr2 = (int*)((int)a + 1);
//	printf("%x,%x", ptr1[-1], *ptr2);
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int n = 9;
//	float* pFloat = (float*)&n;
//	printf("n的值为：%d\n", n);
//	printf("*pFloat的值为：%f\n", *pFloat);
//	*pFloat = 9.0;
//	printf("num的值为：%d\n", n);
//	printf("*pFloat的值为：%f\n", *pFloat);
//	return 0;
//}

/* atoi example */
#include <stdio.h>      
#include <stdlib.h>     
#include <assert.h>
#include <ctype.h>
int Myatoi(char* str) {
	assert(str);
	while (isspace(*str)) {
		str++;
	}
	int flg = 1;
	if (*str == '+') {
		flg = 1;
		str++;
	}
	else if (*str == '-') {
		flg = -1;
		str++;
	}
	long long ret = 0;
	while (*str != '\0') {
		if (isdigit) {
			ret = ret * 10 + (*str - '0') * flg;
			if (ret > INT_MAX || ret < INT_MIN) {
				return 0;
			}
		}
		else {
			return ret;
		}
		str++;
	}
	return ret;
}
int main()
{
	int ret = Myatoi("12653");
	printf("%d\n", ret);
	return 0;
}
//#include <stdio.h>
//char* Mystrncpy(char* dest, const char* str, int n) {
//	int i = 0;
//	for (i = 0; str != '\0' && i < n; i++) {
//		dest[i] = str[i];
//	}
//	if (i < n) {
//		dest[i] = '\0';
//	}
//	return dest;
//}
//int main() {
//	char *dest[20] = { 0 };
//	char* str = "hello";
//	Mystrncpy(dest, str, 3);
//	printf("%s\n", dest);
//	return 0;
//}